package com.wswy.wyjk.utils;

import android.app.Activity;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.os.AsyncTask;
import android.preference.PreferenceManager;
import android.text.TextUtils;
import android.util.Log;

import com.geetest.sdk.GT3ConfigBean;
import com.geetest.sdk.GT3ErrorBean;
import com.geetest.sdk.GT3GeetestUtils;
import com.geetest.sdk.GT3Listener;
import com.geetest.sdk.utils.GT3ServiceNode;
import com.geetest.sdk.views.GT3GeetestButton;
import com.google.gson.Gson;
import com.my.httpapi.api.baseUtils.LogUtils;
import com.wswy.wyjk.ui.login.LoginActivity;
import com.wswy.wyjk.ui.login.model.GeeResponse;

import org.json.JSONObject;

public class GeetestUtils {
    /**
     * api1，需替换成自己的服务器URL
     */
    private static final String bindCaptchaURL = "http://jk.zqwzc.com/captcha/gee-test-register";
    private static final String unBindCaptchaURL = "";
    private static final String OnePassCaptchaURL = "";
    /**
     * api2，需替换成自己的服务器URL
     */
    private static final String bindValidateURL = "http://jk.zqwzc.com/captcha/gee-test-verify";
    private static final String unBindValidateURL = "";
    private static final String OnePassValidateURL = "";


    private static GT3GeetestUtils mGt3GeetestUtils;
    private static GT3ConfigBean gt3ConfigBean;

    private static final String TAG = "GeetestUtils";

    private static String rquestCaptchaUrl, rquestValidateUrl;

    /**
     * 0 绑定 1 非绑定 2 一键通过
     *
     * @param activity 上下文
     * @param button   按钮
     * @param type     类型
     */
    public static void customVerity(Activity activity, GT3GeetestButton button, int type) {
        if (type == 1) {
            rquestCaptchaUrl = bindCaptchaURL;
            rquestValidateUrl = bindValidateURL;
        } else if (type == 2) {
            rquestCaptchaUrl = unBindCaptchaURL;
            rquestValidateUrl = unBindValidateURL;
        } else if (type == 3) {
            rquestCaptchaUrl = OnePassCaptchaURL;
            rquestValidateUrl = OnePassValidateURL;
        }
        // TODO 请在oncreate方法里初始化以获取足够手势数据来保证第一轮验证成功率
        if (mGt3GeetestUtils == null)
            mGt3GeetestUtils = new GT3GeetestUtils(activity);
        // 配置 GT3ConfigBean 文件, 也可在调用 startCustomFlow 方法前处理
        gt3ConfigBean = new GT3ConfigBean();
        // 设置验证模式, 1: bind, 2: unbind
        int pattern = type == 3 ? type - 1 : type;//type等于3-1 type=2
        gt3ConfigBean.setPattern(pattern);
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(activity);
        // 设置回退键是否 DismissDialog, 默认 Dismiss
        gt3ConfigBean.setUnCanceledOnTouchKeyCodeBack(preferences.getBoolean("settings_switch_key_back", true));
        // 设置点击灰色区域是否 DismissDialog, 默认 Dismiss
        gt3ConfigBean.setCanceledOnTouchOutside(preferences.getBoolean("settings_switch_background", true));
        // 设置语言, 如果为 null 则使用 Activity 默认语言
        gt3ConfigBean.setLang(preferences.getString("settings_language", null));
        // 设置加载 WebView 超时时间, 单位 ms, 默认10000, 仅且 WebView 加载静态文件超时，不包括之前的 https 请求
        // gt3ConfigBean.setTimeout(Integer.parseInt(preferences.getString("settings_timeout_load_web", Constants.TIMEOUT_DEFAULT)));
        // 设置 WebView 内部 H5 页面请求超时, 单位 ms, 默认 10000
        // gt3ConfigBean.setWebviewTimeout(Integer.parseInt(preferences.getString("settings_timeout_h5", Constants.TIMEOUT_DEFAULT)));
        // 设置验证服务集群节点, 默认为中国节点, 使用其他节点需要相应配置, 否则无法使用验证
        gt3ConfigBean.setGt3ServiceNode(GT3ServiceNode.NODE_CHINA);
        // 设置回调监听
        gt3ConfigBean.setListener(new GT3Listener() {

            /**
             * 验证码加载完成
             * @param duration 加载时间和版本等信息，为json格式
             */
            @Override
            public void onDialogReady(String duration) {
                Log.e(TAG, "GT3BaseListener-->onDialogReady-->" + duration);
            }

            /**
             * 图形验证结果回调
             * @param code 1为正常 0为失败
             */
            @Override
            public void onReceiveCaptchaCode(int code) {
                Log.e(TAG, "GT3BaseListener-->onReceiveCaptchaCode-->" + code);
            }

            /**
             * 自定义api2回调
             * @param result，api2请求上传参数
             */
            @Override
            public void onDialogResult(String result) {
                Log.e(TAG, "GT3BaseListener-->onDialogResult-->" + result);
                // 开启api2逻辑
                new RequestAPI2(activity).execute(result);
            }

            /**
             * 统计信息，参考接入文档
             * @param result
             */
            @Override
            public void onStatistics(String result) {
                Log.e(TAG, "GT3BaseListener-->onStatistics-->" + result);
            }

            /**
             * 验证码被关闭
             * @param num 1 点击验证码的关闭按钮来关闭验证码, 2 点击屏幕关闭验证码, 3 点击返回键关闭验证码
             */
            @Override
            public void onClosed(int num) {
                Log.e(TAG, "GT3BaseListener-->onClosed-->" + num);

            }

            /**
             * 验证成功回调
             * @param result
             */
            @Override
            public void onSuccess(String result) {
                Log.e(TAG, "GT3BaseListener-->onSuccess-->" + result);

            }

            /**
             * 验证失败回调
             * @param errorBean 版本号，错误码，错误描述等信息
             */
            @Override
            public void onFailed(GT3ErrorBean errorBean) {
                Log.e(TAG, "GT3BaseListener-->onFailed-->" + errorBean.toString());
            }

            /**
             * 自定义api1回调
             */
            @Override
            public void onButtonClick() {
                new RequestAPI1().execute();
            }
        });
        mGt3GeetestUtils.init(gt3ConfigBean);
        if (type == 1) {
            // 开启验证
            mGt3GeetestUtils.startCustomFlow();
        } else {
            button.setGeetestUtils(mGt3GeetestUtils);
        }
    }

    /**
     * 请求api1
     */
    static class RequestAPI1 extends AsyncTask<Void, Void, JSONObject> {

        @Override
        protected JSONObject doInBackground(Void... params) {
            // TODO 添加时间戳防止请求被缓存
            String string = NetRequestUtils.requestGet(bindCaptchaURL);
            JSONObject jsonObject = null;
            try {
                jsonObject = new JSONObject(string);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return jsonObject;
        }

        @Override
        protected void onPostExecute(JSONObject parmas) {
            // 继续验证
            Log.i(TAG, "RequestAPI1-->onPostExecute: " + parmas);
            // SDK可识别格式为
            // {"success":1,"challenge":"06fbb267def3c3c9530d62aa2d56d018",
            // "gt":"019924a82c70bb123aae90d483087f94"}
            // 设置返回api1数据
            // TODO 将api1请求结果传入此方法，即使为null也要传入，SDK内部已处理
            gt3ConfigBean.setApi1Json(parmas);
            mGt3GeetestUtils.getGeetest();
        }
    }

    /**
     * 请求api2
     */
    static class RequestAPI2 extends AsyncTask<String, Void, String> {
        private Activity activity;

        public RequestAPI2(Activity activity) {
            this.activity = activity;
        }

        @Override
        protected String doInBackground(String... params) {
            if (!TextUtils.isEmpty(params[0])) {
                return NetRequestUtils.requestPostByForm(bindValidateURL, params[0]);
            } else {
                return null;
            }
        }

        @Override
        protected void onPostExecute(String result) {
            Log.i(TAG, "RequestAPI2-->onPostExecute: " + result);
            if (!TextUtils.isEmpty(result)) {
                try {
                    JSONObject jsonObject = new JSONObject(result);
                    int status = jsonObject.getInt("code");
                    if (status == 0) {
                        LogUtils.e("result:" + result);
                        mGt3GeetestUtils.showSuccessDialog();
                        JSONObject JSONObjectData = jsonObject.getJSONObject("data");
                        GeeResponse geeResponse = new Gson().fromJson(JSONObjectData.toString(), GeeResponse.class);
                        if (activity instanceof LoginActivity) {
                            LoginActivity loginActivity = (LoginActivity) activity;
                            loginActivity.geeData(geeResponse.getTicket());
                        }
                    } else {
                        mGt3GeetestUtils.showFailedDialog();
                    }
                } catch (Exception e) {
                    mGt3GeetestUtils.showFailedDialog();
                    e.printStackTrace();
                }
            } else {
                mGt3GeetestUtils.showFailedDialog();
            }
        }
    }


    /**
     * 页面关闭时释放资源
     */
    public static void onDestroy() {
        if (mGt3GeetestUtils != null) {
            mGt3GeetestUtils.destory();
            mGt3GeetestUtils = null;
        }
    }

    /**
     * 界面切换
     */
    public static void changeDialogLayout(Configuration configuration) {
        /**
         * 设置后，界面横竖屏不会关闭验证码，推荐设置
         */
        if (mGt3GeetestUtils != null) {
            mGt3GeetestUtils.changeDialogLayout();
        }
    }

}
